Para empezar, y como siempre, necesitaremos dos clases, una para nodo y otra para lista. Además la clase para nodo debe ser amiga de la clase lista, ya que ésta debe acceder a los miembros privados de nodo.
class nodo { public: nodo(int v, nodo *sig = NULL) { valor = v; siguiente = sig; } private: int valor; nodo *siguiente; friend class lista; }; typedef nodo *pnodo; class lista { public: lista() { actual = NULL; } ~lista(); void Insertar(int v); void Borrar(int v); bool ListaVacia() { return actual == NULL; } void Mostrar(); void Siguiente(); bool Actual() { return actual != NULL; } int ValorActual() { return actual->valor; } private: pnodo actual; };
Hemos hecho que la clase para lista sea algo más completa que la equivalente en C, aprovechando las prestaciones de las clases.
Los algoritmos para insertar y borrar elementos son los mismos que expusimos para el ejemplo C, tan sólo cambia el modo de crear y destruir nodos.
#include <iostream> using namespace std; class nodo { public: nodo(int v, nodo *sig = NULL) { valor = v; siguiente = sig; } private: int valor; nodo *siguiente; friend class lista; }; typedef nodo *pnodo; class lista { public: lista() { actual = NULL; } ~lista(); void Insertar(int v); void Borrar(int v); bool ListaVacia() { return actual == NULL; } void Mostrar(); void Siguiente(); bool Actual() { return actual != NULL; } int ValorActual() { return actual->valor; } private: pnodo actual; }; lista::~lista() { pnodo nodo; // Mientras la lista tenga más de un nodo while(actual->siguiente != actual) { // Borrar el nodo siguiente al apuntado por lista nodo = actual->siguiente; actual->siguiente = nodo->siguiente; delete nodo; } // Y borrar el último nodo delete actual; actual = NULL; } void lista::Insertar(int v) { pnodo Nodo; // Creamos un nodo para el nuevo valor a insertar Nodo = new nodo(v); // Si la lista está vacía, la lista será el nuevo nodo // Si no lo está, insertamos el nuevo nodo a continuación del apuntado // por lista if(actual == NULL) actual = Nodo; else Nodo->siguiente = actual->siguiente; // En cualquier caso, cerramos la lista circular actual->siguiente = Nodo; } void lista::Borrar(int v) { pnodo nodo; nodo = actual; // Hacer que lista apunte al nodo anterior al de valor v do { if(actual->siguiente->valor != v) actual = actual->siguiente; } while(actual->siguiente->valor != v && actual != nodo); // Si existe un nodo con el valor v: if(actual->siguiente->valor == v) { // Y si la lista sólo tiene un nodo if(actual == actual->siguiente) { // Borrar toda la lista delete actual; actual = NULL; } else { // Si la lista tiene más de un nodo, borrar el nodo de valor v nodo = actual->siguiente; actual->siguiente = nodo->siguiente; delete nodo; } } } void lista::Mostrar() { pnodo nodo = actual; do { cout << nodo->valor << "-> "; nodo = nodo->siguiente; } while(nodo != actual); cout << endl; } void lista::Siguiente() { if(actual) actual = actual->siguiente; } int main() { lista Lista; Lista.Insertar(20); Lista.Insertar(10); Lista.Insertar(40); Lista.Insertar(30); Lista.Insertar(60); Lista.Mostrar(); cout << "Lista de elementos:" << endl; Lista.Borrar(10); Lista.Borrar(30); Lista.Mostrar(); cin.get(); return 0; }
© Agosto de 2001 Salvador Pozo, salvador@conclase.net